﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;


//c++ 定位new
//class A
//{
//public:
//	A(int a = 0)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//// 定位new/replacement new
//int main()
//{
//	// p1现在指向的只不过是与A对象相同大小的一段空间，还不能算是一个对象，因为构造函数没有执行
//		A* p1 = (A*)malloc(sizeof(A));
//	new(p1)A;  // 注意：如果A类的构造函数有参数时，此处需要传参
//	p1->~A();
//	free(p1);
//
//
//	A* p2 = (A*)operator new(sizeof(A));
//	new(p2)A(10);
//	p2->~A();
//	operator delete(p2);
//	return 0;
//}

//函数模板格式
//template<typename T>
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}


//对称二叉树
//bool rootcompare(struct TreeNode* left, struct TreeNode* right)
//{
//    if (left == NULL && right != NULL)
//        return false;
//    else if (left != NULL && right == NULL)
//        return false;
//    else if (left == NULL && right == NULL)
//        return true;
//    else if (left->val != right->val)
//        return false;
//
//    bool first = rootcompare(left->left, right->right);
//    bool two = rootcompare(left->right, right->left);
//    bool ret = first && two;
//    return ret;
//}
//bool isSymmetric(struct TreeNode* root) {
//    if (!root)
//        return false;
//    return rootcompare(root->left, root->right);
//}


//力扣 相同的数
//bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//    if (p == NULL && q == NULL)
//        return true;
//    else if (p == NULL && q != NULL)
//        return false;
//    else if (p != NULL && q == NULL)
//        return false;
//    if (p->val != q->val)
//        return false;
//
//    bool first = isSameTree(p->left, q->left);
//    bool two = isSameTree(p->right, q->right);
//    bool ret = first && two;
//    return ret;
//}

//另一课子树
//bool compare(struct TreeNode* left, struct TreeNode* right)
//{
//    if (left == NULL && right == NULL)
//        return true;
//    else if (left == NULL && right != NULL)
//        return false;
//    else if (left != NULL && right == NULL)
//        return false;
//    else if (left->val != right->val)
//        return false;
//    bool first = compare(left->left, right->left);
//    bool two = compare(left->right, right->right);
//    return first && two;
//
//}
//bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
//    if (root == NULL)
//        return false;
//    bool mid = compare(root, subRoot);
//    bool left = isSubtree(root->left, subRoot);
//    bool right = isSubtree(root->right, subRoot);
//
//    return mid || left || right;
//}